#include <iostream>
#include "RingQueue.hpp"
#include<unistd.h>
#include <ctime>
#include "Task copy.hpp"
void* producter(void* args)
{
 RingQueue<Task>*rq=static_cast<RingQueue<Task>*>(args);  
 int len=opers.size();
    while(true)
    {
        int x=rand()%10+1;
        int y=rand()%10;
    //生产数据1. 获取数据 2. 产生数据
    Task t(x,y,opers[rand()%len]);
    rq->push(t);
        std::cout<<"product task done... task is: "<<t.getTask()<<std::endl;
        sleep(1);
    
    }
    return nullptr;
}
void* consumer(void* args)
{
 RingQueue<Task>*rq=static_cast<RingQueue<Task>*>(args);   

    //消费数据
    while(true)
    {
        Task t;
      rq->pop(&t);
        t.run();
        std::cout<<"consum task done... task is: "<<t.getTask()<<" task result is:"<<t.getResult()<<std::endl;
        sleep(1);
    }
    return nullptr;
}
int main()
{
    srand(time(nullptr)^getpid());
    //创建特定结构的内存空间
    RingQueue<Task>* rq=new RingQueue<Task>() ;
    //创建生产者、消费者线程
    pthread_t c[2],p[2];
    for(int i=0;i<3;i++)
    {
    pthread_create(c+i,nullptr,consumer,rq);

    }
    for(int i=0;i<5;i++)
    {
    pthread_create(p+i,nullptr,producter,rq);

    }

    //线程等待
    for(int i=0;i<5;i++)
    {
    pthread_join(p[i],nullptr);

    }
    for(int i=0;i<3;i++)
    {
    pthread_join(c[i],nullptr);//等待不关心
    }
    return 0;
}